package com.swa99ylum.pxf.cell.injector;

import org.apache.poi.xssf.usermodel.XSSFCell;

import com.swa99ylum.pxf.cell.styler.CellStyler;

/**
 * 注射器：注射 单元格 的 "值"、"样式"
 * <br> 由于给 注射器、样式器 传递的 是 XSSFCell，所以 注射器、样式器 中 也可以设置：
 * <br> > "值"
 * <br> > "格式（例如：常规、日期格式）"
 * <br> > "样式"
 * <br> > "公式"
 * <br>
 * <br> 单独定义出 "注射器"、"样式器" 的 概念，是因为 这 2 个 业务 比较常用，即 抽象出、定义出 通用的 代码逻辑，方便复用
 * <br>
 * <br>TODO: 
 * <br>1、如果 将来 对于 "公式"、"格式" 设置的 需求较大时，可能还会有 "公式器"、"格式器"。
 * <br>2、"样式器"、"公式器"、"格式器" 都应当 设置在 "注射器" 中，开发者 在 自定义 "注射器" 之后，
 * 		    只需 重写 doStyle()、doFormulate()、doType() 即可 自由控制 所装配的 "样式器"、"公式器"、"格式器" 的 处理逻辑
 * <br>3、如果 把 "注射器"、"样式器"、"公式器"、"格式器" 都定义在 CellFiller 中，此时 想要 更改 默认的 设置流程，就必须重写 CellFiller 中的 方法，但这样就 侵入了 主流程
 * <br>4、总结：CellInjector：用户拥有 高度自主性，方便重写；CellFiller：涉及到 主流程，不方便重写
 * 
 * @author lsy
 */
public abstract class CellInjector {
	
	/**
	 * 样式器
	 */
	protected CellStyler styler;
	
	
	/*--------------------------------------------
    |      				核心方法			         |
    ============================================*/
	/**
	 * 核心方法：注射 单元格 的 "值"、"样式"
	 * <br> doInject() : 设置单元格内容
	 * <br> doStyle() : 设置单元格样式 
	 * 
	 * @param cell : 所要操作的 单元格对象
	 * @param cellValue : 单元格对象 的 值
	 */
	public void inject(XSSFCell cell, Object cellValue) {
		try {
			
			/* 
			 * 背景：
			 * 在 doInject() 可能会 把 cellValue 加工成 cellValue'，然后再 落地到 xlsx 上
			 * 
			 * 技巧：
			 * 如果 doStyle() 在 设置 style 时，需要用到 cellValue' 进行一些 逻辑判断，
			 * 那么在 doInject() 中，就应当把 cellValue' 写回到 cellValue 上，这样 就能以 "引用传递" 的方式 把 cellValue'传给 doStyle() 了：
			 * 
			 * cellValue = cellValue'
			 */
			
			doInject(cell, cellValue); //设置 单元格 内容
			
			doStyle(cell, cellValue); //设置 单元格 样式
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	public abstract void doInject(XSSFCell cell, Object cellValue);
	
	/**
	 * 如果 样式器 不为 null，说明 定义了 "cell的 样式设置 逻辑"，则 进行 "单元格样式的 设置"
	 * 
	 * @param cell : 所要操作的 单元格对象
	 * @param cellValue : 单元格对象 的 值
	 */
	public void doStyle(XSSFCell cell, Object cellValue) {
		if(styler != null) styler.style(cell, cellValue);
	}
	
	
	
	
	/*--------------------------------------------
    |      			getter、setter		         |
    ============================================*/
	public CellStyler getStyler() {
		return styler;
	}

	public void setStyler(CellStyler styler) {
		this.styler = styler;
	}
	
	
	

}
